package com.wuxinwudai.android.util;

import android.util.Base64;
import android.util.Log;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * SecurityUtils 类提供安全加密和解码工具
 * @author  吾心无待 于 2015年10月26日
 */
public class SecurityUtils {
    private static final String TAG = "SecurityUtils";
    /**
     * 对字符串进行 MD5 加密
     * @param source 要加密的字符串
     * @return byte 数组
     */
    public static byte[] getMd5Encrypt(String source){
        try {
            MessageDigest alg = MessageDigest.getInstance("MD5");
            alg.update(source.getBytes());
            return alg.digest();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 对字符串进行 SHA1 加密
     * @param source 要加密的字符串
     * @return byte 数组
     */
    public static byte[] getSha1Encrypt(String source){
        try {
            MessageDigest alg = MessageDigest.getInstance("SHA-1");
            alg.update(source.getBytes());
            return alg.digest();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将字节数组转换为十六进制表示字符串
     * @param bytes byte 数组
     * @return 十六进制表示的字符串
     */
    public static String bytes2HexString(byte[] bytes){
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < bytes.length; i++) {
            final int b = bytes[i] & 255;
            if (b < 16) {
                sb.append('0');
            }
            sb.append(Integer.toHexString(b));
        }
        return sb.toString();
    }

    /**
     * MD5 双重加密
     * @param source 要加密的字符串
     * @param salt 密码盐
     * @return byte 数组
     */
    public static byte[] getDoubleMd5Encrypt(String source,String salt){
        try {
            MessageDigest alg = MessageDigest.getInstance("MD5");
            alg.update(source.getBytes("UTF-8"));
            byte[] first = bytes2HexString(alg.digest()).getBytes("UTF-8");
            byte[] saltBytes = salt.getBytes("UTF-8");
            alg.reset();
            alg.update(ArrayUtils.join(first,saltBytes));
            return alg.digest();
        }catch (NoSuchAlgorithmException ex){
            Log.e(TAG,"NoSuchAlgorithmException : " + ex.getMessage());
        }catch (UnsupportedEncodingException ex){
            Log.e(TAG,"UnsupportedEncodingException : " + ex.getMessage());
        }
        return null;
    }
    /**
     * SHA1 双重加密
     * @param source 要加密的字符串
     * @param salt 密码盐
     * @return byte 数组
     */
    public static byte[] getDoubleSha1Encrypt(String source,String salt){
        try {
            MessageDigest alg = MessageDigest.getInstance("SHA1");
            alg.update(source.getBytes("UTF-8"));
            byte[] first = bytes2HexString(alg.digest()).getBytes("UTF-8");
            byte[] saltBytes = salt.getBytes("UTF-8");
            alg.reset();
            alg.update(ArrayUtils.join(first,saltBytes));
            return alg.digest();
        }catch (NoSuchAlgorithmException ex){
            Log.e(TAG,"NoSuchAlgorithmException : " + ex.getMessage());
        }catch (UnsupportedEncodingException ex){
            Log.e(TAG,"UnsupportedEncodingException : " + ex.getMessage());
        }
        return null;
    }
    /**
     * MD5 加密
     * @param source 要加密的字符串
     * @return 加密后的十六进制表示的字符串
     */
    public static String md5(String source){
        return bytes2HexString(getMd5Encrypt(source));
    }
    /**
     * SHA1 加密
     * @param source 待加密的字符串
     * @return 加密后十六进制表示的字符串
     */
    public static String sha1(String source){ return bytes2HexString(getSha1Encrypt(source)); }
    /**
     * 双重 MD5 加密
     * @param source 要加密的字符串
     * @param salt 密码盐
     * @return 加密后的字符串
     */
    public static String doubleMd5(String source,String salt){
        return bytes2HexString(getDoubleMd5Encrypt(source, salt));
    }
    /**
     * 双重 SHA1 加密
     * @param source 要加密的字符串
     * @param salt 密码盐
     * @return 加密后的字符串
     */
    public static String doubleSha1(String source,String salt){
        return bytes2HexString(getDoubleSha1Encrypt(source,salt));
    }

    /**
     * base64 编码
     * @param source 待编码的字符串
     * @return base64 字符串
     */
    public static String base64Encode(String source){
        return Base64.encodeToString(source.getBytes(),Base64.DEFAULT);
    }

    /**
     * base64 解码
     * @param base64 base64 字符串
     * @return 解码后的字符串
     */
    public static String base64Decode(String base64){
        return Base64.encodeToString(base64.getBytes(),Base64.DEFAULT);
    }
}
